/*
    *********************
    定义请求处理基类
    可以在此基类的基础上进一步定义
    *********************
*/


/*
    知识点复习：
    protected专门就是为继承（子类）设计的 用public继承，
    基类所有的访问标识在子类不变， protected还是protected 。

　　C++编程思想中是这么说的，public意味着随后的定义对所有人都适用；
    private意味着除了该类型的创建者和该类型的内部成员函数之外，任何人都无法访问这些定义；
    而protected是继承的类可以访问protected的成员，但不能访问private的成员。
*/ 

#ifndef REQUESTPROCESSOR
#define REQUESTPROCESSOR

#include "HTTPRelated.h"
#include "redis.h"


class requestProcessor {
protected:
    bool UseRedis;
    bool KeepAlive;
    int ClientSockfd;
    llhttp_method method;
    std::string url;
    std::map<std::string, std::string> heads; //HTTP请求头部 其实就是键值对 
    Json::Reader jsonReader;
    Json::Value messageBody;
    Redis* redis;

public:
    explicit requestProcessor(int isUseRedis = false, int keepAlive = true, int cli = -1):UseRedis(isUseRedis), KeepAlive(keepAlive), ClientSockfd(cli) {
        redis = nullptr;
        url = "";
    }

    
    requestProcessor(requestProcessor& p) = delete;
    requestProcessor(requestProcessor&& p) = delete;
    requestProcessor& operator=(requestProcessor& p) = delete;
    requestProcessor& operator=(requestProcessor&& p) = delete;
    
    // 纯虚函数部分
    virtual ~requestProcessor() = default;
    virtual void run() = 0;
    virtual void setClientSockfd(int new_fd) = 0;
    virtual void setMessageBody(const std::string& body) = 0;
    virtual llhttp_method getMethod() = 0;
    
    // 重载() 变为可调用对象 交付线程池

    void addHead(const std::string& field, const std::string &value) {
        // 操作HTTP请求头部
        this->heads[field] = value;
    }

    std::string getUrl() {
        return this->url;
    }

    void setUrl(const std::string& s) {
        this->url = s;
    }

    void setRedis(Redis* redis) {
        this->redis = redis;
    }

    void setUseRedis(bool isUse) {
        this->UseRedis = isUse;
    }

    bool getkeepAliveStatu() {
        return this->KeepAlive;
    }

    int getClientSockfd() {
        return this->ClientSockfd;
    }
};



#endif